home *** CD-ROM | disk | FTP | other *** search
/ PC Home 138 / PC Home issue 138.iso / Software / Essentials / Netscape / nim.xpi / bin / chrome / aim.jar / content / aim / chatContent.js < prev    next >
Encoding:
JavaScript  |  2002-06-02  |  27.7 KB  |  937 lines

  1. // globals
  2.  
  3. var invitedScreenNames = window.arguments[0].invitedScreenNames;
  4. //dump('got invitedScreenNames'+invitedScreenNames+"\n\n")    
  5. var chatRoomName= window.arguments[0].chatRoomName;
  6. //dump('got chatRoomName'+chatRoomName+"\n\n")    
  7. var chatLanguage= window.arguments[0].chatLanguage;
  8. //dump('got chatLanguage'+chatLanguage+"\n\n")    
  9. var chatMsg = window.arguments[0].chatMsg;
  10. //dump("got chatMsg "+chatMsg+"\n\n")
  11. var chatPanelLoaded = false;
  12.  
  13. var chatFromURL = window.arguments[0].fromurl;                          
  14. var chatExchange = window.arguments[0].exchange;                        
  15. var chatInstance = window.arguments[0].instance; 
  16. // globals for invite
  17.  
  18. var incomingChat = window.arguments[0].incomingChat;
  19. var inviteProposalScreenName = window.arguments[0].incomingChatInviteProposalScreenName;
  20. var inviteProposalObj= window.arguments[0].incomingChatInviteProposalObj;
  21.  
  22. var isChatContent = true;
  23. var showTimestampVal;
  24.     
  25. // globals for conversion
  26.      
  27.     var smileyCodes = new Array(7);
  28.     smileyCodes[0] = /:-?\)/g;
  29.     smileyCodes[1] = /:-D/g;
  30.     smileyCodes[2] = /:-?\(/g;
  31.     smileyCodes[3] = /:-\[/g;
  32.     smileyCodes[4] = /;-?\)/g;
  33.     smileyCodes[5] = /:-\\/g;
  34.     smileyCodes[6] = /:-P/g;
  35.  
  36.     var smileyImgs = new Array('<img src="chrome://editor/content/images/smile_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  37.                                '<img src="chrome://editor/content/images/laughing_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  38.                                '<img src="chrome://editor/content/images/frown_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  39.                                '<img src="chrome://editor/content/images/embarrassed_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  40.                                '<img src="chrome://editor/content/images/wink_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  41.                                '<img src="chrome://editor/content/images/undecided_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  42.                                '<img src="chrome://editor/content/images/tongue_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>');
  43.  
  44.  
  45. // timestamp
  46.     
  47. var IDateTime = Components.classes["@mozilla.org/intl/scriptabledateformat;1"].createInstance();
  48. var aDateTime = IDateTime.QueryInterface(Components.interfaces.nsIScriptableDateFormat);
  49.  
  50. //ChatRoomManager setup 
  51. //         ***start***
  52. function chatRoomMemberObj(screenName,status,ignored,blocked){
  53.     this.screenName=screenName;
  54.     this.status=status;
  55.     this.ignored=ignored;
  56.     this.blocked=blocked;
  57.     return this;
  58. }
  59.  
  60.  
  61. function chatRoomManagerObj(){
  62.     this.members = new Array();
  63.     this.roomname = "";
  64.     
  65.     return this;
  66.     }    
  67.  
  68. function chatRoomManagerAddMember(managerObj,membername,status,ignored,blocked){
  69.     managerObj.members[managerObj.members.length] = new chatRoomMemberObj(membername,status,ignored,blocked);
  70.     //dump("chatRoomManagerAddMember: "+membername+"\n");
  71. }
  72.  
  73. function chatRoomManagerShowMembers(managerObj){
  74.     for(i=0;i<managerObj.members.length;i++){
  75.         alert(managerObj.members[i].screenName);
  76.     }
  77. }
  78.  
  79. function chatRoomManagerDelMember(managerObj,membername){
  80.     var tempMembersArray = new Array();
  81.     for(k=0;k<managerObj.members.length;k++){
  82.         if(managerObj.members[k].screenName.toLowerCase() == membername.toLowerCase()){
  83.             //copy members to new Array, except for deleted one.
  84.             for(m=0;m<managerObj.members.length;m++){
  85.                 if(m!=k){
  86.                     tempMembersArray[tempMembersArray.length] = managerObj.members[m];    
  87.                 }
  88.             }
  89.             //swap old array with new one.
  90.             managerObj.members = tempMembersArray;
  91.         }
  92.     }
  93.         //dump("chatRoomManagerDelMember: "+membername+"\n");
  94.  
  95.     
  96. }
  97.  
  98. function chatRoomManagerUpdateMember(managerObj,membername,status){
  99.     var changedFlag = false;
  100.         for(i=0;i<managerObj.members.length;i++){
  101.             if(managerObj.members[i].screenName.toLowerCase()==membername.toLowerCase()){
  102.                 managerObj.members[i].status = status
  103.                 changedFlag=true;
  104.             }
  105.  
  106.         }
  107.         if(!changedFlag){
  108.             //didnt change anyone - must not be here yet!
  109.             chatRoomManagerAddMember(managerObj,membername,status,false,false)
  110.         }
  111.         
  112.         //dump("chatRoomManagerUpdateMember[of "+managerObj.members.length+" ]: "+membername+"\n");
  113.  
  114. }
  115.  
  116.  
  117.  var myManager = new chatRoomManagerObj();
  118.  
  119. //ChatRoomManager setup ***end***
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126. // Setup Callbacks
  127.  
  128.  
  129. //Setup Room Callbacks (basically event capturing)
  130.  
  131. var RoomCallback= new Object();
  132.  
  133. RoomCallback.OnMessageReceived = function(screenName, rcvdMsg, language){
  134.     //dump("OnMessageReceived:"+rcvdMsg+"\n");
  135.     //dump (screenName + " SAYETH " + rcvdMsg + " IN " + language +"\n");
  136.     chatContentRecieveMsg(screenName,rcvdMsg)
  137. }
  138.  
  139. RoomCallback.OnWhisperReceived = function(screenName,  rcvdWhispMsg, language){
  140.     //dump("OnWhisperReceived:"+rcvdWhispMsg+"\n");
  141.     chatContentRecieveMsg(screenName,rcvdWhispMsg)
  142. }
  143.  
  144.  
  145. RoomCallback.OnLeft = function(errorMsg){
  146.     //dump("Onleft: error["+errorMsg+"] \n");
  147.     chatContentReceiveStatus(null, aimString("chat.YouLeft").replace(/%ChatRoom%/, chatRoomName));
  148.     updateStatus(aimString("chat.YouLeft").replace(/%ChatRoom%/, chatRoomName));
  149. }
  150.  
  151. RoomCallback.OnJoined = function(){
  152.     //dump("OnJoin: \n")
  153.     //dump("Yes I Joined\n");
  154.     chatContentReceiveStatus(null, aimString("chat.YouJoined").replace(/%ChatRoom%/, chatRoomName));
  155.     updateStatus(aimString("chat.YouJoined").replace(/%ChatRoom%/, chatRoomName));
  156.  
  157. }
  158.  
  159. RoomCallback.OnUserJoined = function(screenName){
  160.   //dump("OnUserJoined:"+screenName+"\n");
  161.   updateStatus(aimString("chat.OnUserJoined").replace(/%ScreenName%/, screenName));
  162.     //update their status in the list
  163.   top.frames['chatpanel'].chatPanelUpdateScreenName(screenName,"joined")
  164.     
  165.     //update their status in the global obj
  166.     chatRoomManagerUpdateMember(myManager,screenName,"joined")
  167.     try {
  168.         chatAnnounce_pref=aimPrefsManager().GetBoolPref("aim.chat.AnnounceChatRoom", null, false);
  169.         }
  170.         catch (ex) {
  171.             chatAnnounce_pref = true;
  172.            }
  173.  
  174.     var currentScreenName = aimSessionCurrentScreenName();      
  175.     if ((chatAnnounce_pref && (currentScreenName != screenName)))
  176.     {
  177.         chatContentReceiveStatus(screenName, aimString("chat.OnUserJoined").replace(/%ScreenName%/,""));
  178.     }
  179.   chatRoomManagerUpdateMember(myManager,screenName,"joined")
  180.  
  181. }
  182.  
  183. RoomCallback.OnUserLeft = function(screenName){
  184.   //dump("OnUserLeft:"+screenName+"\n");
  185.   updateStatus(aimString("chat.OnUserLeft").replace(/%ScreenName%/, screenName));
  186.     top.frames['chatpanel'].chatPanelRemoveScreenName(screenName)
  187.     //update global obj
  188.     chatRoomManagerDelMember(myManager,screenName)
  189.  
  190.     var chatAnnounce_pref;
  191.     try {
  192.         chatAnnounce_pref=aimPrefsManager().GetBoolPref("aim.chat.AnnounceChatRoom", null, false);
  193.         }
  194.     catch (ex) {
  195.            chatAnnounce_pref = true;
  196.         }
  197.     if (chatAnnounce_pref)
  198.     {
  199.         chatContentReceiveStatus(screenName, aimString("chat.OnUserLeft").replace(/%ScreenName%/, ""));
  200.     }
  201.     
  202.     
  203. }
  204.  
  205. RoomCallback.OnPaused = function(){
  206.     //dump("OnPaused: \n");
  207.     //chatContentReceiveStatus(null,aimString("chat.RoomPaused"));
  208.     updateStatus(aimString("chat.RoomPaused"));
  209.  
  210. }
  211.  
  212. RoomCallback.OnResumed = function(){
  213.     //dump("OnResumed: \n");
  214.     //chatContentReceiveStatus(null,aimString("chat.RoomResumed"));
  215.     updateStatus(aimString("chat.RoomResumed"));
  216. }
  217.  
  218. RoomCallback.OnInfoUpdate = function(){
  219.     //dump("OnInfoUpdate: \n")
  220.     
  221. }
  222.  
  223. RoomCallback.OnClientError = function(screenName,errMsg){
  224.     //dump("OnClientError: error["+screenName+" : "+errMsg+"]\n");
  225.     //chatContentReceiveStatus(screenName,aimString("chat.ClientError"));
  226.     updateStatus(aimString("chat.ClientError").replace(/%ScreenName%/, screenName));
  227. }
  228.  
  229.  
  230. // end Setup Room Callback
  231.  
  232.  
  233.  
  234.  
  235. // Setup ChatManager Callback 
  236.  
  237. var CallBack = new Object();
  238. var RoomCreationTimeStamp = null;
  239. CallBack.title = aimString("chat.WindowTitle");
  240.  
  241. CallBack.OnRequestRoomComplete =  function(roomName,chatRoomObj){
  242.     //dump("OnRequestRoomComplete: success on "+roomName+"\n");
  243.     //dump("chatRoomObj"+chatRoomObj+"\n")
  244.     RoomCreationTimeStamp= new Date();
  245.     chatRoomObj.SetChatRoomCallback( RoomCallback )
  246.     top.chatRoomObj = chatRoomObj;
  247.     
  248.     //dump("roomName is " + roomName + "\n");
  249.     //dump("chatRoomName is " + chatRoomName + "\n");
  250.     //dump("roomObjName is " + chatRoomObj.GetName() + "\n");
  251.  
  252.     if (roomName)
  253.         window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, roomName);
  254.     else if (chatRoomName)
  255.         window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, chatRoomName);
  256.     else if (chatRoomObj.GetName())
  257.         window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, chatRoomObj.GetName());
  258.     
  259.     window.setTimeout('top.chatRoomObj.Join()', 1000);
  260.     if(invitedScreenNames)
  261.         window.setTimeout('chatContentInviteMany(invitedScreenNames,chatMsg)',1500);
  262.     //window.setTimeout('top.chatRoomObj.SendMessage("This is working!!")', 30000);
  263.     //window.setTimeout('top.chatRoomObj.SendWhisper("trip004", "Private message for vishy26aug")', 30000);
  264.     
  265. }
  266.  
  267.  
  268. CallBack.OnRequestRoomError =  function(roomName,errMsg){
  269.     //dump("OnRequestRoomError: there was an error \n");
  270.  
  271. }
  272.  
  273. CallBack.OnProposalReceived = function(screenName,proposalObj){
  274.     //dump("OnProposalReceived:"+screenName+"  \n");
  275.  
  276. }
  277.  
  278.  
  279.  
  280. //Chat Sound handling
  281.  
  282. function chatSound(msg)
  283. {
  284.     aimSoundManager().ChatEvent(msg);
  285. }
  286.  
  287. // first thing to do on startup
  288.  
  289. function chatContentStartup(){
  290.  
  291.     pChatManager = aimChatManager();
  292.     if (!pChatManager)
  293.     {
  294.         //dump("chatContentStartup:unable to get pChatManager\n");
  295.         return;
  296.     }
  297.     else{
  298.             //dump("chatContentStartup:got  pChatManager\n");
  299.  
  300.     }
  301.  
  302.  
  303.     //dump("chatContentStartup: calling pChatManager.GetMaxConcurrentRooms\n");
  304.  
  305.     var rooms = new Object();
  306.     
  307.     try {
  308.         //dump("trying pChatManager.GetMaxConcurrentRooms(rooms) \n");
  309.         pChatManager.GetMaxConcurrentRooms(rooms);
  310.         }
  311.     catch (e){
  312.         //dump("!!!!! catching js error during pChatManager.GetMacConcurrentRooms !!!!! \n")
  313.         //dump ("rooms.label: "+rooms.label + "\n");
  314.     
  315.     }
  316.     
  317.     
  318.  
  319. // got chatroom name from arguments passed to the opendialog
  320.  
  321.  
  322.     if(incomingChat){
  323.         //dump("About to CallbackIncoming\n");
  324.         CallBack.OnRequestRoomComplete(window.arguments[0].chatRoomName, window.arguments[0].incomingChatRoom);    
  325.  
  326.     }
  327.     else {    
  328.         try {
  329.             if(chatFromURL && (chatExchange != 0)) {                                               
  330.                 pChatManager.RequestRoom(CallBack, chatRoomName, chatLanguage, chatExchange, chatInstance)
  331.             }                                                               
  332.                 else { 
  333.                 //dump("chatContentStartup: trying pChatManager.RequestPrivateRoom\n");
  334.                 pChatManager.RequestPrivateRoom(CallBack,chatRoomName, chatLanguage)
  335.             }
  336.         }
  337.         catch (e){
  338.             //dump("chatContentStartup: E = " + e + "\n");
  339.             alert("There was an error loading the Chat window");
  340.         }    
  341.     }
  342.   showTimestampVal = aimPrefsManager().GetBoolPref("aim.general.im.timeStamp",
  343.     null, false);
  344.  
  345.   SetTimestampMenuItem();
  346. }
  347.  
  348. // One more level of callback in order that chat manager can be ready
  349. myExecutionCallback = new Object();
  350. myExecutionCallback.ExecuteIfReady = function()
  351. {
  352. // get chatroom and callbacks
  353.       //dump ("before chatContentStartup\n");
  354.     chatContentStartup();
  355.     //dump("after Chatcontentstartup\n");
  356.     
  357.     // startup the ender widget
  358.     startUpEditor(document.getElementById("ComposeWnd"));
  359.     
  360.     updateMemberCount();
  361.     //chatContentAddMsgToLog('goober','hi');
  362.  
  363.     try{
  364.         if(!chatFromURL)
  365.             window.opener.close();
  366.     }
  367.     catch (e){
  368.         //dump("chat: where's my invite window?? \n")
  369.     }    
  370. }
  371.  
  372. // after the window has loaded:
  373.  
  374. function chatContentOnWinLoad(){
  375.  
  376.     var bbox = document.getElementById("ComposeWnd");
  377.     if (bbox)
  378.     { 
  379.       bbox.addEventListener("keypress", composeKeyPress, true);
  380.     }
  381.  
  382.     aimChatManager().OnWindowLoad(top);
  383.     aimChatManager().ExecuteIfReady(myExecutionCallback);
  384.     
  385.     
  386.  
  387. }
  388.  
  389. function composeKeyPress(event)
  390. {
  391.   if (event.keyCode == 13) { 
  392.  
  393.     if (SendOnEnter() == true) { 
  394.         event.preventBubble();
  395.         event.preventDefault(); 
  396.         window.setTimeout('chatContentSendMsg()', 1, true); 
  397.         return false; 
  398.         } 
  399.     return true;
  400.   } 
  401.  
  402.   if (event.keyCode == 9) {
  403.  
  404.     if (OnTab() == true) { 
  405.       document.getElementById('btnSend').focus();
  406.       event.preventDefault();
  407.       return false;
  408.       }
  409.     return true;        
  410.   }
  411.             
  412. }
  413.  
  414. // window is closing
  415.  
  416. function chatContentOnWinUnLoad(){
  417.     aimChatManager().OnWindowUnload(top);
  418.     try{
  419.         top.chatRoomObj.Leave()
  420.         }
  421.     catch (e){
  422.         //dump("chat: there was an error trying to call chatRoomObj.leave() \n");
  423.     }    
  424.  
  425. }    
  426.  
  427.  
  428.  
  429. function startUpEditor(editorElement){
  430.  
  431.     if (!editorElement) {
  432.         //dump("No editor element found\n");
  433.         return;
  434.     }
  435.     
  436.     var editorShell = editorElement.editorShell;
  437.     if(editorShell) {            
  438.         // save the editorShell in the window. The editor JS expects to find it there.
  439.         window.editorShell = editorShell;
  440.  
  441.         //SetupToolbarElements(); //defined into editor.js
  442.         window.editorShell.editorType = "html";
  443.  
  444.         window.editorShell.contentWindow = window._content;
  445.         window.editorShell.webShellWindow = window;
  446.         window.editorShell.LoadUrl("about:blank");
  447.         EditorSharedStartup();
  448.     } else {
  449.         //dump("No editorShell found\n");
  450.         return;
  451.     }
  452.   var DocumentStateListener =
  453.   {
  454.     NotifyDocumentCreated: function()
  455.     {
  456.       var nsIPlaintextEditor = Components.interfaces.nsIPlaintextEditor;
  457.       window.editorShell.editor.flags |= nsIPlaintextEditor.eEditorNoCSSMask;
  458.       //see bugzilla bug 112960 for why we have a timeout call
  459.       setTimeout("setStyles()", 100);
  460.     },
  461.     NotifyDocumentWillBeDestroyed: function() {},
  462.     NotifyDocumentStateChanged:function( isNowDirty ) {}
  463.   };
  464.  
  465.   // add a listener to be called when the editor is really done loading
  466.   editorShell.RegisterDocumentStateListener( DocumentStateListener );
  467. }
  468.  
  469.  
  470. // updates the number of chat members (use after an add or delete member)
  471.  
  472. function updateMemberCount(){
  473.         //theTree = document.getElementById("cptChildren");
  474.         
  475.     var theTreeChildren = top.frames["chatpanel"].document.getElementsByTagName("listitem")
  476.         var activeMembers=0;
  477.         
  478.         for(i=0 ; i<theTreeChildren.length;i++){
  479.             
  480.             //dump("updateMemberCount:class "+theTreeChildren.item(i).getAttribute("class")+"\n")
  481.             //dump("updateMemberCount:label "+theTreeChildren.item(i).getAttribute("label")+"\n")
  482.             
  483.       if(theTreeChildren.item(i).getAttribute("class") == "joined") {
  484.                 activeMembers++;
  485.             }
  486.         }
  487.         
  488.         //dump("theTreeNode"+theTree+" \n")
  489.         theMemberCountNode=document.getElementById("numberchatting")
  490.         
  491.         if(activeMembers!=1){
  492.           theMemberCountNode.setAttribute("label", aimString("chat.PeopleHere").replace(/%NumPeople%/, activeMembers));
  493.         }
  494.         else{
  495.           theMemberCountNode.setAttribute("label", aimString("chat.PersonHere"));
  496.         }
  497. }
  498.  
  499.  
  500.  
  501. //send your message out
  502. function SendOnEnter()
  503. {
  504.     // if enterCR_pref_value is true, the pref was set so that enter was a CR
  505.         // if enterCR_pref_value is false, the user wants enter to send the IM message
  506.     try {
  507.         enterCR_pref_value = aimPrefsManager().GetBoolPref("aim.general.im.enterCR", null, false);
  508.     }
  509.     catch (ex) {
  510.         // default to be "send on enter key"
  511.         enterCR_pref_value = true;
  512.     }
  513.     
  514.     return (!enterCR_pref_value);
  515. }
  516.  
  517. function OnTab()
  518. {
  519.     var Tab_pref_value = false;
  520.     try {
  521.         Tab_pref_value = aimPrefsManager().GetBoolPref("aim.general.im.tabKey", null, false);
  522.     }
  523.     catch (ex) {
  524.         // default
  525.         Tab_pref_value = true;
  526.     }
  527.  
  528.     return (!Tab_pref_value);
  529. }
  530.  
  531. /* Name: getMaxIndividualMessage
  532.  *
  533.  * Arguments: 
  534.  *      none.
  535.  * Return Value:
  536.  *      maxIndividualMessageLength -- maximum length of an individual chat message.
  537.  *
  538.  * Description:
  539.  *      This function caches maxIndividuaMessageLength, and calls
  540.  *      nsIAimChatRoom::GetMaxIndividualMessageLength if the cache is empty.
  541.  *
  542.  * Author:
  543.  *      Joseph Elwell 07/04/2001
  544.  * 
  545. */
  546. var maxIndividualMessageLength = -1;
  547. function getMaxIndividualMessage(){
  548.         if (maxIndividualMessageLength == -1) {
  549.                 maxIndividualMessageLength = top.chatRoomObj.GetMaxIndividualMessageLength();
  550.         }
  551.         return maxIndividualMessageLength;
  552. }
  553.         
  554. function chatContentSendMsg(strip){
  555.  
  556.      if (top.editorShell.documentLength > getMaxIndividualMessage())
  557.     {
  558.          var bigChatError = aimString("msg.BigChat").replace(/%BigBy%/, ""+(top.editorShell.documentLength-getMaxIndividualMessage()));
  559.          bigChatError = bigChatError.replace(/471/, ""+(getMaxIndividualMessage()));
  560.          aimErrorBox(bigChatError);
  561.          return;
  562.      }
  563.  
  564.     var bodyText = editorShell.GetContentsAs("text/html", 8 + 4);
  565.         
  566.     /* smiley conversion */
  567.     bodyText = bodyText.replace(/<\/span><\/span>/g,  " ");
  568.     bodyText = bodyText.replace(/<span class="moz-smiley-s[0-9][0-9]?"><span>/g, " ");
  569.  
  570.     // *** placeholder for getting strip pref.
  571.     //var strip=true
  572.  
  573.     if ( strip == true ) {
  574.         bodyText = bodyText.replace(/<br>/gi, "");
  575.         bodyText = bodyText.replace(/\n/g, "");
  576.         bodyText = bodyText.replace(/\r/g, "");
  577.     }
  578.  
  579.     bodyText = bodyText.replace(/\n/g, "");
  580.     bodyText = bodyText.replace(/\r/g, "");
  581.         bodyText = bodyText.replace(/<big>/gi, "<font size=\"+1\">");
  582.         bodyText = bodyText.replace(/<\/big>/gi, "<\/font>");
  583.         bodyText = bodyText.replace(/<small>/gi, "<font size=\"-1\">");
  584.         bodyText = bodyText.replace(/<\/small>/gi, "<\/font>");
  585.     bodyText = bodyText.replace(/<br><br>/gi, "<br>");
  586.     bodyText = bodyText.replace(/<br><\/body>/i, "<\/body>");
  587.     bodyText = bodyText.replace(/\u00a0/gi, " ");
  588.     
  589.     //chatContentAddMsgToLog('noone',bodyText)
  590.  
  591.         try {
  592.             top.chatRoomObj.SendMessage(bodyText);
  593.         } catch( ex ) {
  594.                 aimErrorBox(aimString("chat.SendError"));
  595.                 return;
  596.         }
  597.  
  598.     top.editorShell.SelectAll();
  599.         getStyles();
  600.     top.editorShell.DeleteSelection(null);
  601.     //*** return focus to editor after clicking send ***
  602.         setStyles();
  603.     
  604.     
  605.     top._content.focus();
  606.  
  607.     //Chat Send Sound to hook
  608.     //dump("Outgoing Sound works!\n");
  609.         chatSound(Components.interfaces.nsAimChatSoundEvent.ChatSoundEvent_OutgoingMsg);    
  610.  
  611. }
  612.  
  613.  
  614.  
  615. // handle incoming messages
  616.  
  617. function chatContentRecieveMsg(screenName,msg){
  618.     var chatflash=false;         
  619.     try {
  620.         chatflash=aimPrefsManager().GetBoolPref("aim.chat.FlashChatWin", null, false); 
  621.     }
  622.     catch (ex) {
  623.         chatflash = true;
  624.     }               
  625.     if (chatflash)
  626.             top.window.getAttention();
  627.  
  628.     msg = msg.replace(/<pre>/gi, "");
  629.     msg = msg.replace(/<\/pre>/gi, "");
  630.     chatContentAddMsgToLog(screenName,msg,true)
  631.  
  632.     //Chat Receive Sound to Hook
  633.     //dump("INCOMING SOUND\n");
  634.     if (screenName != aimSessionCurrentScreenName()) {
  635.         chatSound(Components.interfaces.nsAimChatSoundEvent.ChatSoundEvent_IncomingMsg);
  636.     }
  637. }
  638.  
  639. function chatContentReceiveStatus(screenName, msg) {
  640.   chatContentAddMsgToLog(screenName,msg,false);
  641. }
  642.  
  643. // sub timestamp generation
  644. function getTimeStampStr()
  645. {
  646.   var strTimestamp;
  647.     
  648.   var curTime = new Date();
  649.     
  650.   var curHours   = curTime.getHours();  
  651.   var curMinutes = curTime.getMinutes();
  652.   var curSeconds = curTime.getSeconds();
  653.            
  654.   strTimestamp = aDateTime.FormatTime("", aDateTime.timeFormatSeconds,
  655.     curHours, curMinutes, curSeconds);
  656.  
  657.   if (showTimestampVal)
  658.     strTimestamp = "<SPAN class=\"logtimestamp\"style=\"visibility:visible\">" + "(" + strTimestamp + ")" + "</SPAN>";
  659.   else  
  660.     strTimestamp = "<SPAN class=\"logtimestamp\"style=\"display:none\">" + "(" + strTimestamp + ")" + "</SPAN>";
  661.  
  662.   return strTimestamp;
  663. }
  664.  
  665. // sub function conversion smiley codes to images
  666. function convertToSmileyImg(msg){
  667.     var count;
  668.  
  669.     for (count = 0; count < smileyCodes.length; count++)        
  670.         msg = msg.replace(smileyCodes[count], smileyImgs[count] );
  671.     
  672.     return msg;
  673.  
  674. }
  675.  
  676. // sub function of chatContentRecieveMsg
  677. function chatContentAddMsgToLog(screenName,msg,isMsg){
  678.     // There is no contract id for this interface now. mscott/myself will add one later and change this.
  679.     var moz = Components.classesByID["{77c0e42a-1dd2-11b2-8ebf-edc6606f2f4b}"];
  680.     var moztxt = moz.createInstance(Components.interfaces.mozITXTToHTMLConv);
  681.     var iface = Components.interfaces.mozITXTToHTMLConv;
  682.     var mozURL = iface.kURLs;
  683.     
  684.      var smileyFeatureEnabled = aimPrefsManager().GetBoolPref("aim.general.im.smilies", null, false);
  685.      
  686.      if (smileyFeatureEnabled)
  687.          msg = convertToSmileyImg(msg);
  688.  
  689.       var timeStampStr = getTimeStampStr();
  690.  
  691.     var theLogNode = top.frames['LogWnd']
  692.     
  693.     var myRange = theLogNode.document.createRange();
  694.     var theLogBody =theLogNode.document.body;
  695.       myRange.setStartAfter(theLogBody);
  696.     var docFrag;
  697.     // XXXVISHY - this handles info messages also
  698.     if (screenName) {
  699.       var colorpre = " ";
  700.       var colorpost = " </b> ";
  701.       if(msg)
  702.         msg = moztxt.scanHTML(msg, mozURL);
  703.       if (isMsg) // otherwise it is a status
  704.       {
  705.           if (screenName.toLowerCase() == aimSessionCurrentScreenName()) 
  706.             colorpre = '<font color=\"#ff0000\">';
  707.           else
  708.             colorpre = '<font color=\"#0000ff\">';
  709.             
  710.           colorpost = '</b>: </font>';
  711.  
  712.           docFrag = myRange.createContextualFragment("<html>" + colorpre + "<b>"+ screenName + timeStampStr + colorpost+ msg+"</html><br>");
  713.  
  714.       }
  715.       else
  716.          docFrag = myRange.createContextualFragment("<html>" + colorpre + "<b>"+ timeStampStr + screenName + colorpost+ msg+"</html><br>");
  717.     } else
  718.         docFrag = myRange.createContextualFragment("<html><b>"+ timeStampStr + "</b>" + msg+"</html><br>");
  719.       
  720.   var prevdocHeight = theLogNode.document.height;
  721.   var isLocked=((theLogNode.scrollY + theLogNode.innerHeight) >= theLogNode.document.height) 
  722.                   || (( theLogNode.document.height - theLogNode.scrollY ) <= 5)
  723.     theLogBody.appendChild(docFrag)
  724.             
  725.     
  726.   if (isLocked){
  727.     if ((theLogNode.innerHeight - (prevdocHeight-theLogNode.scrollY)) <= 5)
  728.                 return;
  729.     if ((theLogNode.innerHeight < theLogNode.document.height) && (theLogNode.scrollY == prevdocHeight))
  730.                return;
  731.  
  732.       theLogNode.scrollTo(theLogNode.scrollX, theLogNode.document.height)
  733.     }
  734.     
  735. }
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742. //send info to the status area
  743. // defunct!
  744. function updateStatus(statusMsg){
  745.     var statusTextNode= document.getElementById("statustext");
  746.     statusTextNode.setAttribute("value",statusMsg);
  747.  
  748. }
  749.  
  750.  
  751. // handle status changes
  752.  
  753. function chatContentStatusChange(screenName,statusItem){
  754.   //updateStatus(screenName+": "+statusItem)    
  755. }
  756.  
  757.  
  758. /*** Handle Proposal and ProposalOwner for Chat Invitations ***/
  759. var proposals = new Array(); // of all the open proposals;
  760. var aproposal = new Object();
  761.  
  762. function AimProposalOwner()
  763. {
  764.   this.OnProposalAcked = function(pProposal) {
  765.     //dump("OnProposalAcked");
  766.   }
  767.   
  768.   this.OnProposalError = function(pProposal, pErrMsg) {
  769.     aimErrorBox(aimString("chat.NotAvailable").replace(/%ScreenName%/, pProposal.GetProposee()));
  770.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  771.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  772.   }
  773.   
  774.   this.OnProposalAccepted = function(pProposal) {
  775.     //dump("OnProposalAccepted");
  776.   }
  777.   
  778.   this.OnProposalRejected = function(pErrMsg, pScreenName, deleteFromChatPanel) {
  779.     aimErrorBox(pErrMsg);
  780.     if (deleteFromChatPanel) {
  781.       top.frames['chatpanel'].chatPanelRemoveScreenName(pScreenName);
  782.       chatRoomManagerDelMember(myManager,pScreenName);
  783.     }
  784.     }
  785.   
  786.   this.OnProposalCountered = function(pProposal, pCounterProposal) {
  787.     //dump("OnProposalCountered");
  788.   }
  789.   
  790.   this.OnProposalTimeout = function(pProposal) {
  791.     aimErrorBox(aimString("chat.TimedOut"));
  792.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  793.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  794.   }   
  795.  
  796.   this.OnProposalCancelled = function(pProposal) {
  797.     //dump("OnProposalCancelled"); 
  798.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  799.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  800.   }
  801.  
  802.   return this;
  803. }
  804.  
  805. // handle many invitations
  806. function chatContentInviteMany(inviteList,chatMsg){
  807.     // convert carriage returns and newlines to commas 
  808.     inviteList = inviteList.replace(/\n/gi, ",");
  809.     inviteList = inviteList.replace(/\r/gi, ",");
  810.  
  811.     inviteArray=inviteList.split(",")
  812.     for(inviteItem = 0; inviteItem<inviteArray.length; inviteItem++){
  813.         //test to make sure the name isnt empty
  814.         if(itemTest(inviteArray[inviteItem])){
  815.         
  816.             //dump("Inviting["+inviteArray[inviteItem]+"]\n")
  817.             
  818.             aproposal = top.chatRoomObj.Invite(inviteArray[inviteItem], chatMsg);
  819.             proposals[proposals.length] = aproposal;
  820.             //dump("proposals.length is " + proposals.length + "\n")
  821.             proposals[proposals.length-1].SetOwner(new AimProposalOwner());
  822.             //dump("proposals.length is " + proposals.length + "\n");
  823.             //proposals.length++;
  824.             
  825.       top.frames['chatpanel'].chatPanelUpdateScreenName(inviteArray[inviteItem],"invited")
  826.         
  827.       chatRoomManagerAddMember(myManager,inviteArray[inviteItem],"invited",false,false)
  828.         
  829.             //dump("Invited: "+inviteArray[inviteItem]+"\n");
  830.         }
  831.     }
  832.     
  833.  
  834. }
  835.  
  836.  
  837.  
  838. function itemTest(inviteItem){
  839.     var passed = true;
  840.  
  841.  
  842.     switch(inviteItem) {
  843.     
  844.         case "": 
  845.         case " ": passed = false;
  846.         break;
  847.         
  848.     
  849.     }
  850.  
  851.  
  852.     //dump("itemTest: "+passed+"\n");
  853.     return passed;
  854. }
  855.  
  856. // pop up invitation window:
  857.  
  858. function cmdPopUpInvite(screenNames){
  859.     //window.openDialog('chrome://aim/content/chatInviteBuddy.xul','inviteBuddy','chrome,all,dialog=no','',true,"outgoingchat"); 
  860.  
  861.      var isOnline = aimSession().IsOnline();
  862.      if ( isOnline == false ) {
  863.              window.close();
  864.              aimErrorBox(aimString("chat.NotOnline"));
  865.      } else {
  866.              var language = aimString("aim.LanguageCode");    
  867.              inviteArgsObj = {
  868.                 inviteProposalScreenName: '', 
  869.                 inviteProposalObj: null,
  870.                 invitedScreenNames: screenNames,
  871.                 inviteToExistingWindow: true,
  872.                 inviteMode: 'outgoingchat',
  873.                 inviteToExistingRoom: chatRoomName,
  874.                 inviteLanguage: language
  875.              }
  876.                         
  877.              window.openDialog('chrome://aim/content/chatInviteBuddy.xul','inviteBuddy','chrome,all,dialog=no',inviteArgsObj); 
  878.      }
  879. }
  880.  
  881. // display room info
  882.  
  883. function cmdRoomInfo(){
  884.     window.openDialog('chrome://aim/content/chatRoomInfo.xul','charRoomInfo','chrome,all,dialog=no,resizable=no,titlebar',chatRoomName, top.chatRoomObj.GetLanguage(), top.chatRoomObj.GetMaxMessageLength(),RoomCreationTimeStamp.toLocaleString()); 
  885. }
  886.  
  887. function createInstance( contractid, iidName )
  888. {
  889.     var iid = eval( "Components.interfaces." + iidName );
  890.         return Components.classes[ contractid ].createInstance( iid );
  891. }
  892.  
  893.  
  894. function fixScrolling(){
  895.     var LogWindow = top.frames["LogWnd"]
  896.     var pageY = LogWindow.pageYOffset
  897.     var docHeight = LogWindow.innerHeight
  898.  
  899. }
  900.  
  901.  
  902. // ignore user from chat - called this time from top level people menu
  903. // simply accesses the cmdIgnoreFromChat() method present inside the chatpanel iframe
  904.  
  905.  
  906. function cmdIgnoreFromChat_PeopleMenu(){
  907.    top.frames['chatpanel'].cmdIgnoreFromChat();
  908.  
  909. }
  910.  
  911.  
  912. // add buddy - get's the currently selected chat room
  913. // buddy and prepopulates the add buddy dialog.
  914.  
  915. function cmdChatContentAddBuddy()
  916. {
  917. var targetValue = top.frames['chatpanel'].cmdGetSelectedScreenName()
  918. if (targetValue) {
  919.   openDialog("chrome://aim/content/BuddyAddBuddy.xul", "", "modal=yes,titlebar,chrome", null, null, targetValue);
  920.   }
  921. }
  922.  
  923. // get member info - accesses the currently selected chatroom buddy and 
  924. // sends that info to the getmemeberinfo xul file
  925.  
  926. function cmdChatContentGetMemberInfo(){
  927.    var targetValue = top.frames['chatpanel'].cmdGetSelectedScreenName()
  928.    if(targetValue && targetValue != null){
  929.    window.openDialog('chrome://aim/content/GetMemberInfo.xul','_blank','chrome,all,dialog=no', targetValue);
  930.    }
  931.  
  932. }
  933.  
  934.  
  935. function cmdChatContentSendIM(){
  936.    top.frames['chatpanel'].cmdSendIMFromChat();
  937. }